package com.urbane.generator.controller;

import com.urbane.generator.model.dto.GenerateRequest;
import com.urbane.generator.service.CodeGeneratorService;
import com.urbane.generator.service.GenDataSourceService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 代码生成控制器
 */
@RestController
@RequestMapping("/generator")
@Tag(name = "代码生成接口", description = "提供代码生成功能的相关接口")
public class CodeGeneratorController {

    @Resource
    private CodeGeneratorService codeGeneratorService;




    /**
     * 文件下载接口，生成代码
     *
     * @param filename 要下载的文件名
     * @param response HTTP响应对象
     * @throws IOException IO异常
     */
    @PostMapping("/download")
    @Operation(summary = "生成代码", description = "根据提供的数据库连接信息和配置参数生成对应的代码文件")
    public void downloadFile(@RequestBody GenerateRequest request, HttpServletResponse response) throws IOException {
        codeGeneratorService.generateCode(request);

        // 验证文件名安全性（防止路径遍历攻击）
//        if (!isValidFilename(filename)) {
//            response.sendError(HttpStatus.BAD_REQUEST.value(), "无效的文件名");
//            return;
//        }

//        String fileUrl = System.getProperty("user.home") + "/project";
//        System.out.println(fileUrl);
//        ZipUtil.zip(new File(fileUrl), StandardCharsets.UTF_8);

        // 构建文件完整路径
        Path filePath = Paths.get(uploadDir, "target.zip");

        // 检查文件是否存在
        if (!Files.exists(filePath)) {
            response.sendError(HttpStatus.NOT_FOUND.value(), "文件不存在");
            return;
        }

        // 设置响应头
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.setContentLengthLong(Files.size(filePath));

        // 设置文件名（处理中文文件名）
        String encodedFilename = URLEncoder.encode("target.zip", StandardCharsets.UTF_8)
                .replaceAll("\\+", "%20"); // 处理空格
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION,
                "attachment; filename=\"" + encodedFilename + "\"; filename*=UTF-8''" + encodedFilename);

        // 写入文件内容到响应
        Files.copy(filePath, response.getOutputStream());
        response.getOutputStream().flush();
    }

    /**
     * 文件下载接口，代码预览，迁都那使用 https://github.com/highlightjs/highlight.js/
     *
     * @param filename 要下载的文件名
     * @param response HTTP响应对象
     * @throws IOException IO异常
     */
    @PostMapping("/download")
    @Operation(summary = "代码预览", description = "根据提供的数据库连接信息和配置参数生成对应的代码文件")
    public void previewCode(@RequestBody GenerateRequest request, HttpServletResponse response) throws IOException {
        codeGeneratorService.generateCode(request);

        // 验证文件名安全性（防止路径遍历攻击）
//        if (!isValidFilename(filename)) {
//            response.sendError(HttpStatus.BAD_REQUEST.value(), "无效的文件名");
//            return;
//        }

//        String fileUrl = System.getProperty("user.home") + "/project";
//        System.out.println(fileUrl);
//        ZipUtil.zip(new File(fileUrl), StandardCharsets.UTF_8);

        // 构建文件完整路径
        Path filePath = Paths.get(uploadDir, "target.zip");

        // 检查文件是否存在
        if (!Files.exists(filePath)) {
            response.sendError(HttpStatus.NOT_FOUND.value(), "文件不存在");
            return;
        }

        // 设置响应头
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.setContentLengthLong(Files.size(filePath));

        // 设置文件名（处理中文文件名）
        String encodedFilename = URLEncoder.encode("target.zip", StandardCharsets.UTF_8)
                .replaceAll("\\+", "%20"); // 处理空格
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION,
                "attachment; filename=\"" + encodedFilename + "\"; filename*=UTF-8''" + encodedFilename);

        // 写入文件内容到响应
        Files.copy(filePath, response.getOutputStream());
        response.getOutputStream().flush();
    }
}